#pragma once
#include <iostream>
#include <stddef.h>

using ElementType = int;

class DynamicArray
{
public:
    DynamicArray(size_t capacity = 15);
    DynamicArray(const DynamicArray &a);
    DynamicArray &operator=(const DynamicArray &a);
    ~DynamicArray();

    void show();

    size_t Size();
    // 扩容接口
    void ReSize(size_t capacity);

    // 尾部插入
    void InsertTail(const ElementType &element);

    //头部插入
    void InsertHead(const ElementType &element);

    //中间插入
    void InsertByIndex(int index,const ElementType &element);

    //按位置删除
    void RemoveByIndex(int index);

    //按值删除
    void DynamicArray::RemoveByElement(const ElementType &element);

    //按位置查找
    ElementType*FindByIndex(int index);

    //按值查找
    ElementType FindByElement(const ElementType &element);

    //修改
    void UpdateByIndex(int index,const ElementType &element);

    void UpdateByElement(const ElementType &element,const ElementType &newValue);
    //
    void Sort();
    
    //插入排序
    void DynamicArray::InsertSort(size_t start, size_t end);
    

    //去重算法
    void DynamicArray::RemoveDuplicate();

    //合并两个有序数列
    DynamicArray Merge(const DynamicArray &a);

    //找交集
    DynamicArray FindInSctn(const DynamicArray &a);

    //找并集
    DynamicArray FindUnionSet(const DynamicArray &a);

    //找补集
    DynamicArray FindComplement(const DynamicArray &a);

    //判断两个数列是否相等
    bool DynamicArray::operator==(const DynamicArray &a);

    //二分查找
    size_t BinarySearch(const ElementType &element);

    //判断一个数列是否是子数列
    bool IsSubArray(const DynamicArray &a);

    //滑动窗口算法
    bool DynamicArray::IsSubArray(const DynamicArray &a);

    void SetFreePtr();


private:
    void FastSort(size_t start, size_t end);
    //插入排序
    void DynamicArray::InsertSort(size_t start, size_t end);
    ElementType *array;
    size_t capacity;
    size_t size;
    void (*freePtr)(ElementType *ptr);//
    void (*PrintPtr)(ElementType *ptr);//
    bool (*SortPtr)(ElementType *ptr, size_t start, size_t end);//排序指针
    bool (*equalPtr)(ElementType *ptr, size_t start, size_t end);//比较指针
};